Date : 10 Novembre 1991
Protection : ECRANS DE RAPPEL
Programme : VGACOPY V3.2A
Outils : SOFT-ICE V2.50
Fichier : FILLUP!.EXE et VGACOPY.COM
Temps pass� : 3 HEURES
Soci�t� : SHARWARE
Divers : Incapable de reconnaitre une disquette
1.2Mo formatt�e en 730k !
Origine : L.F.
Num�ro : 150
Deux programmes interessant l'un FILLUP! pour remplir les disquettes
afin d'emp�cher un virus d'entrer et l'autre un copieur tous formats
en VGA ! L'un et l'autre compact� "maison".
Le compactage est relativement curieux: certaines instructions se
retrouvent malgr� tout en "entier". C'est essentiellement le cas pour
FILLUP! ce qui permet de le modifier relativement facilement:
CS=0FAE
CS:00E2 807EFF18 CMP BYTE PTR [BP-01],18 ; AFFICHE 18 LIGNES.
CS:00E6 7584 JNZ 006C ; TANT QUE TOUT N'EST PAS AFFICHE.
Avec PCTOOLS chercher 187584 et modifier 75 par 74.
Pour VGACOPY on trouve le m�me type d'instructions avec le m�me test
mais impossible de mettre en �vidence le saut dans le fichier.
Une recherche en �criture de la valeur 74 avec SOFT-ICE me fait
remonter une dizaine de niveaux jusqu'� ce que j'arrive � la chaine
qui se trouve en clair dans le fichier. Mais comme il fallait s'y
attendre une modification d'un octet se r�percute sur la suite du
d�compactage et tout se plante.
Ci-dessous les deux sauts � modifier ( 74 par EB ):
1)-
0FAE:2F01 80BEF8FC14
0FAE:2F06 7403 JNZ ; A REMPLACER PAR EB ( jmp ).
0FAE:2F08 E948FF CALL
2)-
0FAE:2FC9 80BEF9FC06
0FAE:2FCE 7403 JNZ ; A REMPLACER PAR EB ( jmp )
0FAE:2FD0 E91CFE CALL
Il ne reste plus qu'�:
a) Mettre en �vidence l'INT la plus proche, il s'av�re que c'est
l'INT 21 sous-fonction 47.
b) Placer les adresses IP correspondantes: 2F06 et 2FCE.
c) Puis lancer le gaufrier apocalyptique:
; PATCH POUR LE PROGRAMME VGACOPY.EXE
; DETOURNEMENT DE L'INT 21 SOUS-FONCTION 47
;
;******************************************************************************
; ZONE A INITIALISER
adr_ip1 equ 2f06h ; mettre EB � la place de 74.
adr_ip2 equ 2fceh ; .........idem..............
INT_DET equ 21h ; Le num�ro de l'INT que l'on veut utiliser.
sous_fonction equ 47h ; Sous-fonction utilis�e.
;******************************************************************************
seg_a segment byte public
assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a
org 100h
sto proc far
start:
jmp init ; r�duire la m�moire et d�placer la
db 90h ; pile plus pr�s.
nom_prg db 0ffh,0,0,0,0,0,0,0,0,0,0,0,0 ; 12 car max + nul
paramet dw 0 ; M�me bloc d'environnement.
ENVIR dw 0 ; Les param�tres de la ligne de
data_3 dw 0 ; commande sont recopi�s ici puis
FCB_1 dw 0 ; transmis au programme fils. ( 80h )
data_5 dw 0 ; "LOAD /U EGA 1"
FCB_2 dw 0
data_7 dw 0
sauve_SP dw 0
sauve_SS dw 0
data_9 dw 0, 0
drap equ 0
;------------------------------ PROGRAMME PERE ------------------------------
loc_1: mov sauve_SP,sp
mov sauve_SS,ss
mov ax,80h
mov ENVIR,ax ; Ligne de commande...
mov data_3,ds
mov ax,5Ch ; Premier FCB ( inutilis� )
mov FCB_1,ax
mov data_5,ds
mov ax,6Ch ; Second FCB ( inutilis� )
mov FCB_2,ax
mov data_7,ds
mov ah,35h
mov al,INT_DET
int 21h ; DOS Services ah=function 35h
; get intrpt vector al in es:bx
mov cs:data_9,bx
mov word ptr cs:data_9+2,es
mov ah,25h
mov al,INT_DET
lea dx,cs:[_int] ; Load effective addr
int 21h ; DOS Services ah=function 25h
; set intrpt vector al to ds:dx
lea dx,cs:[nom_prg] ; Load effective addr
push ds
pop es
lea bx,cs:[paramet] ; Load effective addr
mov al,0
mov ah,4Bh
int 21h ; Appel du programme fils.
; run progm @ds:dx, parm @es:bx
mov sp,sauve_SP
mov ss,sauve_SS
mov ah,25h
mov al,INT_DET
mov dx,cs:data_9
mov ds,word ptr cs:data_9+2
int 21h ; set intrpt vector al to ds:dx
mov ah,4dh
int 21h
mov ah,4Ch
int 21h ; terminate with al=return code
sto endp
;---------------------------- int 16 d�tourn�e -----------------------------
int_entry proc far
_int: push ax
push ds
push bp
push cx
pushf ; Push flags
cmp byte ptr ds:[drap],1 ; Je regarde si c'est fait.
jz loc_2
cmp ah,sous_fonction ; Sous - fonction de l'INT.
jne loc_2 ; Jump if not equal
mov ax,sp
mov bp,ds
mov cx,20 ; On pope 20 fois pour trouver
incr: pop ds ; le bon segment.
dec cx
jz s
cmp word ptr ds:[adr_ip1],0374h ; Si ok on patche.
jnz incr ; Sinon on incr�mente.
mov byte ptr ds:[adr_ip1],0ebh
mov byte ptr ds:[adr_ip2],0ebh
mov ds,bp
mov byte ptr ds:[drap],1 ; On y revient plus.
s: mov sp,ax
loc_2: popf
pop cx
pop bp
pop ds
pop ax
jmp dword ptr cs:data_9
int_entry endp
;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------
init: mov ah,4ah
mov bx,offset fin ; Fin du programme en BX.
mov cl,4 ; Divis� par 4 pour avoir des paragraphes.
shr bx,cl
inc bx ; On en rajoute un par s�curit�.
int 21h ; Execution de la fonction 4Ah.
mov sp,offset fin ; on d�place la pile en "fin" car elle est
jmp loc_1 ; plac�e en FFFE dans un programme COM.
fin_init label near
;----------------------- PLACE RESERVEE POUR LA PILE ------------------------
dw 47 dup (' ')
db 65 dup ('*')
db 40 dup (' '),'FREDDY_SOFT'
db 44 dup (' '),65 dup ('*')
fin equ this byte ; ici le sommet de la pile, SP
seg_a ends
end start
Et �a marche.
De plus j'ai r�ussi � lancer un programme fils invisible !
FREDDY
|